package _2_2基础算法;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class _离散化 {
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		int[] arr = new int[n];
		int[] sortArr = new int[n];
		Set<Integer> set = new HashSet<>();
		Map<Integer,Integer> map = new HashMap<>();
		for(int i = 0;i < n;i++) {
			arr[i] = scan.nextInt();
			sortArr[i] = arr[i];
		}
		// 1. 先从小到大排序
		// 2. set去重
		// 3. 如果有重复的，因为去重了，则会依旧是上一个size的值 （因为排序了 重复值会挨在一起
		// 4. 此时已经把数值从小到大排序好了，但是题目需要的是原arr[i]元素的顺序输出排名，所以需要↓
		// 4. 根据原arr的值拿到map中对应的排名
		Arrays.sort(sortArr);
		for(int i = 0;i < n;i++) {
			set.add(sortArr[i]);
			map.put(sortArr[i], set.size());
		}
		
		for(int i = 0;i < n; i++) {
			System.out.print(map.get(arr[i]) + " ");
		}
		
		scan.close();
		
	}
}
